package algorithm.t202111;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * @author : 李红磊
 * @version :1.0
 * @date : 2021/11/29 9:14
 * @description :7道
 * 22岁的第一天，还有很多事情要做，最近要确定寒假实习的地方，其实酷渲也还行，主要是工资开的是200一天，其他好的厂也进不去，唉，自己的能力还是太差，还有
 2年就是24岁，3年就是25岁，马上就要进入社会，面临爱情，事业等等，现在想想我也没有过一段完整的恋情，或许我在爱情方面永远是个小白吧哈哈哈，好了，恢复心态，
 努力，奋斗，为进入社会做好最充分的准备，人生最大的成功就是可以用自己喜欢的方式过完这一生，唉，加油加油加油，冲
 persevere to last
 李红磊
 2021年11月29日21:21:33
 */
public class t20211129 {

    //786.第k个最小的素数分数
    public int[] kthSmallestPrimeFraction(int[] arr, int k) {
        if (arr == null) return new int[0];
        int len = arr.length;

        List<int[]> list = new ArrayList<>();

        for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) {
                list.add(new int[]{arr[i], arr[j]});
            }
        }
        Collections.sort(list, (x, y) -> x[0] * y[1] - y[0] * x[1]);
        return list.get(k - 1);
    }

    //387.字符串中第一个唯一字符
    public int firstUniqChar(String s) {
        return 0;
    }

    //383.赎金信
    public boolean canConstruct(String ransomNote, String magazine) {
        return true;
    }

    //242.有效的字母异位词
    public boolean isAnagram(String s, String t) {
        return true;
    }

    //152.乘积最大子数组
    public int maxProduct(int[] nums) {
        if (nums == null || nums.length == 0) return 0;

        int res = Integer.MIN_VALUE, imax = 1, imin = 1;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < 0) {
                int tem = imax;
                imax = imin;
                imin = tem;
            }
            imax = Math.max(nums[i], nums[i] * imax);
            imin = Math.min(nums[i], nums[i] * imin);

            res = Math.max(res, imax);

        }

        return res;
    }

    //1567.乘积为正数的最长子数组长度
    public int getMaxLen(int[] nums) {
        if (nums == null) return 0;
        int len = nums.length;

        int[] pos = new int[len + 1];//设 POS[i] 前i个元素，乘积为正的最长子数组的长度。
        int[] neg = new int[len + 1];//设 NEG[i] 前i个元素，乘积为负的最长子数组的长度。
        int res = 0;

        for (int i = 0; i < len; i++) {
            if (nums[i] == 0) {
                pos[i + 1] = 0;
                neg[i + 1] = 0;
            } else if (nums[i] > 0) {
                pos[i + 1] = pos[i] + 1;
                neg[i + 1] = neg[i] == 0 ? 0 : neg[i] + 1;
            } else {
                pos[i + 1] = (neg[i] == 0) ? 0 : neg[i] + 1;
                neg[i + 1] = pos[i] + 1;
            }
            res = Math.max(res, pos[i + 1]);
        }
        return res;
    }

    //9.回文数
    public boolean isPalindrome(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) return false;

        int reverse_number = 0;

        while (x > reverse_number) {
            reverse_number = reverse_number * 10 + x % 10;
            x /= 10;
        }

        //x==reverse_number/10是针对奇数个的回文数，如121
        return x == reverse_number || x == reverse_number / 10;

    }


    public static void main(String[] args) {
        t20211129 t20211129 = new t20211129();
        t20211129.maxProduct(new int[]{-2, 0, -1});


    }


}
